package br.com.jvet.persistencia;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.ejb.Stateless;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Root;

import br.com.jvet.constante.StatusAgendamento;
import br.com.jvet.entidade.Agendamento;

@Stateless
public class AgendamentoDAO extends AbstractDAO<Agendamento, Integer> {

	private static String SELECT_EXISTE = "SELECT a from "
			+ Agendamento.class.getSimpleName()
			+ " a where a.dataMarcada =:data and a.horaMarcada =:hora and a.funcionario =:func";

	public AgendamentoDAO() {
		super(Agendamento.class);

	}

	public boolean existe(Agendamento agendamento) {
		Map<String, Object> parameters = new HashMap<String, Object>();

		parameters.put("data", agendamento.getDataMarcada());
		parameters.put("hora", agendamento.getHoraMarcada());
		parameters.put("func", agendamento.getFuncionario());

		Agendamento outro = super.buscarUmResultado(SELECT_EXISTE, parameters);
		if (outro != null && outro.getCodigo() != agendamento.getCodigo()) {
			return true;
		}
		return false;
	}

	public void excluir(Agendamento obj) throws Exception {
		Agendamento entidadeRemover = consultarPorId(obj.getCodigo());
		getEntityManager().remove(entidadeRemover);

	}
	
	public List<Agendamento> buscar(Map<String, Object> parameters) {

		CriteriaBuilder cb = super.getEntityManager().getCriteriaBuilder();
		CriteriaQuery<Agendamento> cq = cb.createQuery(Agendamento.class);

		Root<Agendamento> root = cq.from(Agendamento.class);
		cq.select(root);

		if (parameters.containsKey("status")) {
			Path<StatusAgendamento> name = root.get("statusAgendamento");
			cq.where(cb.and(cb.equal(name, parameters.get("status"))));
		}

		if (parameters.containsKey("datamarcada")) {
			Path<Date> data = root.get("dataMarcada");
			cq.where(cb.and(cb.equal(data, (Date) parameters.get("datamarcada"))));
		}
		TypedQuery<Agendamento> query = super.getEntityManager().createQuery(cq);

		return query.getResultList();

	}

}
